package tech.aistar.corejava.day06;

import java.util.Arrays;

/**
 * @author success
 * @version 1.0
 * @description:本类用来演示:员工类
 * @date 2019/7/22 0022
 */
public class Emp {
    private int id;

    private String empName;

    private int age;

    //对象与对象之间是有关系的
    //1:1 1:N N:N 自关联

    //一个上司是对应多个下属的,多个下属是属于一个上司的
    private Emp[] emps;

    //private Emp emp;

    public Emp() {
    }

    public Emp(int id, String empName, int age, Emp[] emps) {
        this.id = id;
        this.empName = empName;
        this.age = age;
        this.emps = emps;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Emp[] getEmps() {
        return emps;
    }

    public void setEmps(Emp[] emps) {
        this.emps = emps;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Emp{");
        sb.append("id=").append(id);
        sb.append(", empName='").append(empName).append('\'');
        sb.append(", age=").append(age);
        sb.append(", emps=").append(Arrays.toString(emps));
        sb.append('}');
        return sb.toString();
    }

    /**
     * 业务类和实体类合二为一
     * 实体类 - 主要的作用是用来描述对象,数据在内存中的载体
     * 业务类 - 对实体类中的数据进行CRUD操作
     * 将业务方法放在实体类中.
     *
     * 以后肯定推荐实体类应该和业务类分开
     */

    /**
     * 将一个新的下属放入到Emp[]下属的数组中去
     * @param e 加入的员工
     */
    public void addEmp(Emp e){
        //思考 - 如果是下属的对象调用addEmp方法 - 提示:没有权限
        //怎么区分创建出来的对象是下属还是上司呢?

        if(null == emps){
            System.out.println("本身就是下属!没有权限进行添加!");
            return;
        }
        //上司虽然拥有存放下属的容器new Emp[0] - 但是长度是0
        //Emp[] emps = new Emp[0];
        //在将这个新的e存放到emps中去的时候,需要对emps进行扩容

        emps = Arrays.copyOf(emps,emps.length+1);
        //每次都是在数组的末尾处 - 数组长度 - 1
        emps[emps.length-1] = e;

        System.out.println("有权限添加!");
    }

    /**
     * 根据员工的id从Emp[]数组中删除.
     * @param id
     */
    public void delById(int id){
        //id是对象的唯一标识 - 一定是唯一的.
        //从emps中删除
        if(null == emps || emps.length == 0){
            System.out.println("删除失败!");
            return;
        }

        //ArrayUtil - 思路
        Emp[] temp = new Emp[emps.length-1];//存放删除之后的数组.

        //定义数组的下标计数器
        int pos = 0;

        for (int i = 0; i < emps.length; i++) {
            if(emps[i].getId()!=id){
                temp[pos++] = emps[i];
            }
        }

        emps = temp;
    }

    /**
     * 根据员工的名称进行删除
     * @param empName
     */
    public void delByEmpName(String empName){
        if(null == emps || emps.length == 0){
            System.out.println("删除失败!");
            return;
        }
        //先统计empName是否存在...
        //定义一个变量,用来统计empName的个数
        int count = 0;

        for (int i = 0; i < emps.length; i++) {
            if(emps[i].getEmpName().equals(empName)){
                count++;
            }
        }
        if(count == 0){
            System.out.println("sorry,不存在!");
            return;
        }

        //count记录的就是empName出现的个数
        Emp[] temp = new Emp[emps.length - count];

        //定义一个下标计数器
        int pos = 0;

        for (int i = 0; i < emps.length; i++) {
            if(!emps[i].getEmpName().equals(empName)){
                temp[pos++] = emps[i];
            }
        }
        emps = temp;
    }
}
